package com.blog.cmrpersonalblog.utils;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @提及工具类
 * 用于解析评论中的@用户
 */
public class MentionUtils {

    /**
     * @提及的正则表达式
     * 匹配格式: @用户昵称 或 @{userId:昵称}
     */
    private static final Pattern MENTION_PATTERN = Pattern.compile("@([\\u4e00-\\u9fa5a-zA-Z0-9_-]+)|@\\{(\\d+):([^}]+)\\}");

    /**
     * 从文本中提取所有@提及的用户昵称
     * 
     * @param content 评论内容
     * @return 被@的用户昵称列表
     */
    public static List<String> extractMentionedNickNames(String content) {
        if (content == null || content.trim().isEmpty()) {
            return new ArrayList<>();
        }

        Set<String> nickNames = new HashSet<>();
        Matcher matcher = MENTION_PATTERN.matcher(content);

        while (matcher.find()) {
            // 匹配 @昵称 格式
            if (matcher.group(1) != null) {
                nickNames.add(matcher.group(1));
            }
            // 匹配 @{userId:昵称} 格式
            else if (matcher.group(3) != null) {
                nickNames.add(matcher.group(3));
            }
        }

        return new ArrayList<>(nickNames);
    }

    /**
     * 从文本中提取所有@提及的用户ID（仅支持 @{userId:昵称} 格式）
     * 
     * @param content 评论内容
     * @return 被@的用户ID列表
     */
    public static List<Long> extractMentionedUserIds(String content) {
        if (content == null || content.trim().isEmpty()) {
            return new ArrayList<>();
        }

        Set<Long> userIds = new HashSet<>();
        Matcher matcher = MENTION_PATTERN.matcher(content);

        while (matcher.find()) {
            // 匹配 @{userId:昵称} 格式
            if (matcher.group(2) != null) {
                try {
                    userIds.add(Long.parseLong(matcher.group(2)));
                } catch (NumberFormatException e) {
                    // 忽略无效的用户ID
                }
            }
        }

        return new ArrayList<>(userIds);
    }

    /**
     * 检查文本中是否包含@提及
     * 
     * @param content 评论内容
     * @return 是否包含@提及
     */
    public static boolean hasMentions(String content) {
        if (content == null || content.trim().isEmpty()) {
            return false;
        }
        return MENTION_PATTERN.matcher(content).find();
    }

    /**
     * 将@提及转换为HTML链接
     * 
     * @param content 评论内容
     * @return 转换后的HTML内容
     */
    public static String convertMentionsToHtml(String content) {
        if (content == null || content.trim().isEmpty()) {
            return content;
        }

        Matcher matcher = MENTION_PATTERN.matcher(content);
        StringBuffer result = new StringBuffer();

        while (matcher.find()) {
            String replacement;
            // 匹配 @昵称 格式
            if (matcher.group(1) != null) {
                String nickName = matcher.group(1);
                replacement = String.format("<a href=\"/user/%s\" class=\"mention\">@%s</a>", 
                        nickName, nickName);
            }
            // 匹配 @{userId:昵称} 格式
            else if (matcher.group(2) != null && matcher.group(3) != null) {
                String userId = matcher.group(2);
                String nickName = matcher.group(3);
                replacement = String.format("<a href=\"/user/%s\" class=\"mention\">@%s</a>", 
                        userId, nickName);
            } else {
                replacement = matcher.group(0);
            }
            matcher.appendReplacement(result, replacement);
        }
        matcher.appendTail(result);

        return result.toString();
    }

    /**
     * 构建@提及文本（用于前端显示）
     * 
     * @param userId 用户ID
     * @param nickName 用户昵称
     * @return @提及文本
     */
    public static String buildMentionText(Long userId, String nickName) {
        return String.format("@{%d:%s}", userId, nickName);
    }

    /**
     * 从@提及文本中提取用户ID
     * 
     * @param mentionText @提及文本
     * @return 用户ID，如果提取失败返回null
     */
    public static Long extractUserIdFromMention(String mentionText) {
        if (mentionText == null || !mentionText.startsWith("@{")) {
            return null;
        }

        Pattern pattern = Pattern.compile("@\\{(\\d+):");
        Matcher matcher = pattern.matcher(mentionText);
        
        if (matcher.find()) {
            try {
                return Long.parseLong(matcher.group(1));
            } catch (NumberFormatException e) {
                return null;
            }
        }
        
        return null;
    }
}

